package pe.gob.foncodes.spp.bs.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.gob.foncodes.spp.bs.domain.Objetivo;

/**
 * 
 * @author lcastro
 * @version 1.0
 * 
 */

@Repository
public class ObjetivoDAOImpl extends BaseDAO<Objetivo> implements ObjetivoDAO {

	@Autowired
	public ObjetivoDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}

	public void guardarObjetivo(Objetivo objetivo) {
		save(objetivo);
	}

	public Objetivo actualizarObjetivo(Objetivo objetivo) {
		return update(objetivo);
	}

	public Objetivo buscarObjetivoPorId(Serializable id) {
		return findById(id, Objetivo.class);
	}

	public List<Objetivo> buscarObjetivos() {
		return findAll(Objetivo.class);
	}

	public List<Objetivo> buscarObjetivosPorPortafolio(Long nIdPortafolio) {
		StringBuilder sql = new StringBuilder();
		sql.append(" Select a from Objetivo a where a.portafolio.nidPortafolio= "
				+ nIdPortafolio);
		return findByQuery(sql);
	}

	public List<Objetivo> buscarObjetivoPorIdoNOmbreOtipoObjetivo(
			Objetivo objetivo) {

		DetachedCriteria criteria = DetachedCriteria.forClass(Objetivo.class);
		if (objetivo != null) {
			if (objetivo.getNidObjetivo() != null
					&& !objetivo.getNidObjetivo().equals(0L)) {
				criteria.add(Restrictions.eq("nidObjetivo",
						objetivo.getNidObjetivo()));
			}

			if (objetivo.getTxtObjetivo() != null
					&& !"".equals(objetivo.getTxtObjetivo())) {
				criteria.add(Restrictions.like("txtObjetivo",
						"%" + objetivo.getTxtObjetivo() + "%"));
			}

			if (objetivo.getTipObjetivo() != null
					&& !"0".equals(objetivo.getTipObjetivo())) {
				criteria.add(Restrictions.eq("tipObjetivo",
						objetivo.getTipObjetivo()));
			}
		}

		criteria.addOrder(Order.desc("nidObjetivo"));

		return findByCriteria(criteria);
	}

}
